import axios from "axios";
import { ElMessage } from "element-plus";

// 全局配置
axios.defaults.baseURL = import.meta.env.VITE_URL;
axios.defaults.timeout = 10000;
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';

// 添加拦截器
// 请求拦截
axios.interceptors.request.use(
  (config) => {
    // 在请求之前做一些公共配置处理
    return config;
  },
  (error) => {
    // 请求报错的处理,使用Promise处理异步请求返回
    return Promise.reject(error);
  }
);
// 响应拦截
axios.interceptors.response.use(
  (response) => {
    if (response.status === 200) {
      // 成功的异步返回
      return Promise.resolve(response);
    } else {
      // 失败的异步返回
      return Promise.reject(response);
    }
  },
  (error) => {
    if (error.response.status === 400) {
      ElMessage({
        type: "error",
        message: "请求参数传递错误",
      });
    } else if (error.response.status === 403) {
      ElMessage({
        type: "error",
        message: "您没有权限访问",
      });
    } else if (error.response.status === 404) {
      ElMessage({
        type: "error",
        message: "资源地址错误",
      });
    } else if (error.response.status === 405) {
      ElMessage({
        type: "error",
        message: "请求方法类型错误",
      });
    } else if (error.response.status === 500) {
      ElMessage({
        type: "error",
        message: "服务器内部错误",
      });
    } else {
      ElMessage({
        type: "error",
        message: error.response.data.msg,
      });
    }

    return Promise.reject(error.response);
  }
);

// 封装常用的请求方法
/**
 * 封装的公共请求get方法
 * @param url ：请求的服务器地址（controller中设计的地址）
 * @param params ：请求地址传递的参数（controller中方法中的参数）
 * @returns ：返回的Promise对象，resolve：成功的异步返回 reject：失败的异步返回
 */
const get = (url: string, params: any) => {
  return new Promise((resolve, reject) => {
    axios
      .get(url, { params: params })
      .then((res) => {
        // 请求成功的回调
        resolve(res.data);
      })
      .catch((err) => {
        // 请求失败的回调
        reject(err);
      });
  });
};

// 封装post方法
const post = (url: string, params: any) => {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params)
      .then((res) => {
        // 请求成功的回调
        resolve(res.data);
      })
      .catch((err) => {
        // 请求失败的回调
        reject(err);
      });
  });
};

// 封装put方法
const put = (url: string, params: any) => {
  return new Promise((resolve, reject) => {
    axios
      .put(url, params)
      .then((res) => {
        // 请求成功的回调
        resolve(res.data);
      })
      .catch((err) => {
        // 请求失败的回调
        reject(err);
      });
  });
};

// 封装delete方法
const del = (url: string, params: any) => {
  return new Promise((resolve, reject) => {
    axios
      .delete(url, { params: params })
      .then((res) => {
        // 请求成功的回调
        resolve(res.data);
      })
      .catch((err) => {
        // 请求失败的回调
        reject(err);
      });
  });
};


// 导出封装的方法
var http = {
    get,
    post,
    put,
    del
}

export default http